home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Storage / Translt.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  23.1 KB  |  820 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Translt.cpp
  3.  
  4.     Contains:    Implementation of ODTranslation class.
  5.  
  6.     Owned by:    Vincent Lo
  7.  
  8.     Copyright:    © 1994 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <33>    10/24/95    VL        1294279: Checks existence of CFM library in
  13.                                     addition to Gestalt.
  14.         <32>    10/18/95    CC        GM 1293725: ShowTranslateDialog:
  15.                                     initialEditor parameter may be null.
  16.         <31>    10/16/95    VL        1291692: Added SOM_TRY to
  17.                                     GetISOTypeFromPlatformType and
  18.                                     GetPlatformTypeFromISOType.
  19.         <30>     10/9/95    VL        1288571: Moved
  20.                                     kODErrNoSysTranslationFacility to
  21.                                     ErrorDef.idl.
  22.         <29>     10/8/95    TJ        Fixes Recomended by Refball
  23.         <28>     9/12/95    DM        1280020 FB1 part trans dlg mem leaks
  24.         <27>     8/26/95    TÇ        1274606 FB2: Patching Remarks
  25.         <26>     8/15/95    CC        1276520: ShowTranslateDialog: Changed
  26.                                     "inout" parameter to one "in" and one
  27.                                     "out".
  28.         <25>      8/3/95    RR        #1257260: Collapse B classes. Remove
  29.                                     somInit methods. Don't call IsInitialized
  30.                                     or SubclassResponsibility
  31.         <24>     7/28/95    VL        1270320: Use TempODTypeList for
  32.                                     GetTranslationOf and CommonTranslate.
  33.         <23>     7/14/95    TJ        Turned On TransLation for 68K.
  34.         <22>     6/21/95    CC        1260937: BB: ODTypeListIterator must return
  35.                                     copies of ODType values.
  36.         <21>      6/7/95    CC        1237791: LocalGetPlatformTypeFromISOType:
  37.                                     Initialize result to 0.
  38.         <20>      6/2/95    CC        1236618: Use CreateTypeList factory method.
  39.         <19>     5/26/95    VL        1251403: Multithreading naming support.
  40.         <18>     5/25/95    jpa        Fixed usage of ODDebug. [1253321]
  41.         <17>     5/19/95    VL        1249626: Allocate memory for out
  42.                                     ODByteArray in Translate.
  43.         <16>     4/25/95    VL        1210982: Removed 5$.
  44.         <15>     3/28/95    CC        1229640: Added forPaste parameter to
  45.                                     ShowTranslateDialog call.
  46.         <14>     3/28/95    CC        1233117: Removed unused ODStorageUnit
  47.                                     parameter from  ShowPartTranslateDialog.
  48.         <13>     3/27/95    CC        1229640: Renamed ShowTranslateDialog() to
  49.                                     ShowPartTranslateDialog().
  50.                                     Added ShowPartTranslateDialog().
  51.         <12>     3/23/95    VL        1228275: ASSERT for null ODByteArray.
  52.         <11>     2/10/95    CG        #1177475: Added include for StdDefs.xh.
  53.         <10>     1/10/95    CC        1209483 TranslateView() fixed to write into
  54.                                     destination view.
  55.          <9>    12/20/94    VL        1195012: Make Storage calls be
  56.                                     marshallable.
  57.          <8>    12/13/94    CG        #1187128: Moved Translation dialog code to
  58.                                     Storage subsystem.
  59.          <7>     10/4/94    VL        1162335: Moved consts to StorDef.h.
  60.          <6>     9/29/94    RA        1189812: Mods for 68K build.
  61.          <5>     9/20/94    VL        Fixes for new MEO headers.
  62.          <4>     8/28/94    VL        1183500: Added implementation based on MEO
  63.                                     1.1.
  64.          <3>     8/16/94    VL        1180054: TypeSet should be TypeList.
  65.          <2>     7/26/94    VL        Changed ODType to ODValueType.
  66.          <1>     6/28/94    VL        first checked in
  67.          <1>     6/28/94    VL        first checked in
  68.  
  69.     To Do: 
  70.     In Progress:
  71. */
  72.  
  73. #define ODTranslation_Class_Source
  74. #define VARIABLE_MACROS
  75. #include <Translt.xih>
  76.  
  77. #ifndef SOM_Module_OpenDoc_StdDefs_defined
  78. #include <StdDefs.xh>
  79. #endif
  80.  
  81. #ifndef SOM_ODTypeList_xh
  82. #include <TypeList.xh>
  83. #endif
  84.  
  85. #ifndef SOM_ODTypeListIterator_xh
  86. #include <TypLsItr.xh>
  87. #endif
  88.  
  89. #ifndef SOM_ODStorageSystem_xh
  90. #include <ODStor.xh>
  91. #endif
  92.  
  93. #ifndef SOM_ODStorageUnitView_xh
  94. #include <SUView.xh>
  95. #endif
  96.  
  97. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  98. #include <StdTypes.xh>
  99. #endif
  100.  
  101. #ifndef _ODMEMORY_
  102. #include "ODMemory.h"
  103. #endif
  104.  
  105. #ifndef _ISOSTR_
  106. #include "ISOStr.h"
  107. #endif
  108.  
  109. #ifndef _EXCEPT_
  110. #include "Except.h"
  111. #endif
  112.  
  113. #ifndef _ODMEMORY_
  114. #include "ODMemory.h"
  115. #endif
  116.  
  117. #ifndef _STORDEF_
  118. #include "StorDef.h"
  119. #endif
  120.  
  121. #ifndef _BARRAY_
  122. #include <BArray.h>
  123. #endif
  124.  
  125. #ifndef __TRANSLATION__
  126. #include <Translation.h>
  127. #endif
  128.  
  129. #ifndef __GESTALTEQU__
  130. #include <GestaltEqu.h>    // For Gestalt
  131. #endif
  132.  
  133. #ifndef __TOOLUTILS__
  134. #include <ToolUtils.h>    // For BitTst
  135. #endif
  136.  
  137. #ifndef __EDITIONS__
  138. #include <Editions.h>    // For FormatType
  139. #endif
  140.  
  141. #ifndef __ERRORS__
  142. #include <Errors.h>
  143. #endif
  144.  
  145. #ifndef __MIXEDMODE__
  146. #include <MixedMode.h>
  147. #endif
  148.  
  149. #ifndef _TRANSDLG_
  150. #include <TransDlg.h>
  151. #endif
  152.  
  153. #ifndef _STORUTIL_
  154. #include <StorUtil.h>
  155. #endif
  156.  
  157. #ifndef _TEMPOBJ_
  158. #include <TempObj.h>
  159. #endif
  160.  
  161. #pragma segment ODTranslation
  162.  
  163. #include "TransltB.cpp"    // Platform-independent methods, if any
  164.  
  165. #if ODDebug
  166. // #define ODDebug_Translation 1
  167. #endif
  168.  
  169. //==============================================================================
  170. // Scalar Types
  171. //==============================================================================
  172.  
  173. typedef struct {
  174.     ODOSType    destType;
  175. } TranslationHints;
  176.  
  177. typedef struct {
  178.     FormatType    theType;
  179.     long        theLength;
  180. } FormatAvailable;
  181.  
  182. //==============================================================================
  183. // Local Classes
  184. //==============================================================================
  185.  
  186. class TranslationRefCon {
  187.  
  188. public:
  189.  
  190.     TranslationRefCon() {fTypeList = kODNULL;
  191.                             fDataPtr = kODNULL;
  192.                             fDataType = kODNULL;
  193.                             fDataSize = 0;}
  194.     ~TranslationRefCon() {}
  195.     
  196.     void InitTranslationRefCon(ODTypeList* typeList) {fTypeList = typeList;}
  197.     void InitTranslationRefCon(ODTypeList*     typeList,
  198.                                 ODPtr            dataPtr, 
  199.                                 ODPlatformType    dataType,
  200.                                 ODULong        dataSize) {fTypeList = typeList;
  201.                                                             fDataPtr = dataPtr;
  202.                                                             fDataType = dataType;
  203.                                                             fDataSize = dataSize;}
  204.  
  205.     ODTypeList*    fTypeList;
  206.     ODPtr            fDataPtr;
  207.     ODPlatformType    fDataType;
  208.     ODULong        fDataSize;
  209. };
  210.  
  211. //==============================================================================
  212. // Function Prototype
  213. //==============================================================================
  214.  
  215. static OSErr CommonTranslate(ODTranslation* translation,
  216.                         Environment*    ev,
  217.                         ODValueType        fromType,
  218.                         ODByteArray*    fromData,
  219.                         ODValueType        toType,
  220.                         ODHandle*        destHandle);
  221.  
  222. static pascal OSErr GetScrapDataProc(ScrapType requestedFormat,
  223.                             Handle dataH,
  224.                             void* srcDataGetterRefCon);
  225.  
  226. static ODType LocalGetISOTypeFromPlatformType(ODPlatformType platformType,
  227.             ODPlatformTypeSpace typeSpace);
  228.  
  229. static ODPlatformType LocalGetPlatformTypeFromISOType(ODType isoType);
  230.  
  231. //==============================================================================
  232. // Globals
  233. //==============================================================================
  234.  
  235. static RoutineDescriptor    gGetScrapDataProcRD = BUILD_ROUTINE_DESCRIPTOR(uppGetScrapDataProcInfo, GetScrapDataProc);
  236.  
  237.  
  238. //==============================================================================
  239. // Class ODTranslation
  240. //==============================================================================
  241.  
  242. //------------------------------------------------------------------------------
  243. // ODTranslation: Purge
  244. //------------------------------------------------------------------------------
  245.  
  246. SOM_Scope ODSize  SOMLINK ODTranslationPurge(ODTranslation *somSelf, Environment *ev,
  247.         ODSize size)
  248. {
  249.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  250.     ODTranslationMethodDebug("ODTranslation","ODTranslationPurge");
  251.  
  252.     return 0;
  253. }
  254.  
  255. //------------------------------------------------------------------------------
  256. // ODTranslation: somUninit
  257. //------------------------------------------------------------------------------
  258.  
  259. SOM_Scope void  SOMLINK ODTranslationsomUninit(ODTranslation *somSelf)
  260. {
  261.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  262.     ODTranslationMethodDebug("ODTranslation","ODTranslationsomUninit");
  263.  
  264.     ODDeleteObject(_fTranslationDialog);
  265.     parent_somUninit(somSelf);
  266. }
  267.  
  268. //------------------------------------------------------------------------------
  269. // ODTranslation: InitTranslation
  270. //------------------------------------------------------------------------------
  271.  
  272. SOM_Scope void  SOMLINK ODTranslationInitTranslation(ODTranslation *somSelf, Environment *ev,
  273.         ODSession* session)
  274. {
  275.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  276.     ODTranslationMethodDebug("ODTranslation","ODTranslationInitTranslation");
  277.  
  278.     SOM_TRY
  279.  
  280.     /* Moved from somInit. SOM itself sets fields to zero
  281.     _fMEOExists = kODFalse;
  282.     _fTranslationDialog = kODNULL;
  283.     */
  284.     somSelf->InitObject(ev);
  285.  
  286.     _fSession = session;
  287.  
  288.     ODSLong result;
  289.     
  290.     _fMEOExists = (Gestalt(gestaltTranslationAttr, &result) == noErr) 
  291.                     && (BitTst(&result, 31 - gestaltTranslationMgrExists))
  292.                     && (&TranslateScrap != (void*)kUnresolvedCFragSymbolAddress);
  293.     
  294.     _fTranslationDialog = new TranslationDialog();
  295.     if (_fTranslationDialog)
  296.         _fTranslationDialog->InitTranslationDialog(session);
  297.     
  298.     SOM_CATCH_ALL
  299.     SOM_ENDTRY
  300. }
  301.  
  302. //------------------------------------------------------------------------------
  303. // ODTranslation: CanTranslate
  304. //------------------------------------------------------------------------------
  305.  
  306. SOM_Scope ODTranslateResult  SOMLINK ODTranslationCanTranslate(ODTranslation *somSelf, Environment *ev,
  307.         ODValueType fromType)
  308. {
  309.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  310.     ODTranslationMethodDebug("ODTranslation","ODTranslationCanTranslate");
  311.     
  312.     ODTranslateResult    result;
  313.  
  314.     SOM_TRY
  315.  
  316.     ODTypeList* typeList = somSelf->GetTranslationOf(ev, fromType);
  317.     
  318.     if (typeList->Count(ev) > 0)
  319.         result = kODCanTranslate;
  320.     else
  321.         result = kODCannotTranslate;
  322.         
  323.     delete typeList;
  324.     
  325.     SOM_CATCH_ALL
  326.         result = kODCannotTranslate;
  327.     SOM_ENDTRY
  328.         
  329.     return result;
  330. }
  331.  
  332. //------------------------------------------------------------------------------
  333. // ODTranslation: ShowPartTranslateDialog
  334. //------------------------------------------------------------------------------
  335.  
  336. SOM_Scope ODBoolean  SOMLINK ODTranslationShowPartTranslateDialog(ODTranslation *somSelf, Environment *ev,
  337.     ODPartWrapper* partWrapper)
  338. {
  339.     ODTranslationData *somThis = ODTranslationGetData(somSelf);
  340.     ODTranslationMethodDebug("ODTranslation","ODTranslationShowPartTranslateDialog");
  341.  
  342.     SOM_CATCH return kODFalse;
  343.  
  344.     return _fTranslationDialog->ShowPartTranslateDialog(partWrapper);
  345. }
  346.  
  347. //------------------------------------------------------------------------------
  348. // ODTranslation: ShowTranslateDialog
  349. //------------------------------------------------------------------------------
  350.  
  351. SOM_Scope ODBoolean  SOMLINK ODTranslationShowTranslateDialog(ODTranslation *somSelf, Environment *ev,
  352.                 ODTypeList*    translateToList,
  353.                 ODUShort    initialKind,
  354.                 ODUShort*    selectedKind,
  355.                 ODEditor    initialEditor,
  356.                 ODBoolean    canChangeEditor,
  357.                 ODEditor*    selectedEditor)
  358. {
  359.     ODTranslationData *somThis = ODTranslationGetData(somSelf);
  360.     ODTranslationMethodDebug("ODTranslation","ODTranslationShowTranslateDialog");
  361.  
  362.     ODBoolean result = kODFalse;    ODVolatile(result);
  363.     ODUShort kind = initialKind;    ODVolatile(kind);
  364.     ODEditor editor = kODNULL;        ODVolatile(editor);
  365.  
  366.     *selectedKind = initialKind;
  367.     *selectedEditor = kODNULL;
  368.  
  369.     SOM_TRY
  370.     
  371.         // Convert from initial kind and editor
  372.         if ( initialEditor != kODNULL )
  373.             editor = ODISOStrFromCStr((char *) initialEditor);
  374.     
  375.         result = _fTranslationDialog->ShowTranslateDialog(
  376.                                                     translateToList,
  377.                                                     &kind,
  378.                                                     &editor,
  379.                                                     canChangeEditor,
  380.                                                     kODTrue);
  381.     
  382.         // Convert to selected kind and editor
  383.         if ( result )
  384.         {
  385.             *selectedKind = kind;
  386.             *selectedEditor = editor;
  387.             editor = kODNULL;
  388.         }
  389.  
  390.     SOM_CATCH_ALL
  391.     
  392.     SOM_ENDTRY
  393.  
  394.     ODDisposePtr((ODPtr) editor);
  395.  
  396.     return result;
  397. }
  398.  
  399. //------------------------------------------------------------------------------
  400. // ODTranslation: GetTranslationOf
  401. //------------------------------------------------------------------------------
  402. // Return the set of kinds the argument may be translated into.  Internally, this
  403. // routine converts to and from platform types to use the translation services of
  404. // the host platform.
  405.  
  406. SOM_Scope ODTypeList*  SOMLINK ODTranslationGetTranslationOf(ODTranslation *somSelf, Environment *ev,
  407.         ODValueType fromType)
  408. {
  409.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  410.     ODTranslationMethodDebug("ODTranslation","ODTranslationGetTranslationOf");
  411.  
  412.     SOM_CATCH return kODNULL;
  413.     
  414.     ODHandle destinationTypes;
  415.     
  416.     if (_fMEOExists == kODFalse)
  417.         THROW(kODErrNoSysTranslationFacility);
  418.  
  419.     // Initialize the parameters for TranslateScrap
  420.     // Set up ODTypeList as refCon
  421.     
  422.     TempODTypeList fromTypeList = _fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
  423.     fromTypeList->AddLast(ev, fromType);
  424.     
  425.     TranslationRefCon refCon;
  426.     refCon.InitTranslationRefCon(fromTypeList);
  427.  
  428.     destinationTypes = ODNewHandle(0);
  429.     
  430.     // This TranslateScrap is only a query
  431.     
  432.  
  433.     OSErr err = noErr;
  434.  
  435. //#ifdef __MWERKS__
  436.     // The following call is ifdef out because we don't have a 68K
  437.     // CFM library for Translation Manager yet.
  438.     
  439.     TranslateScrap((GetScrapDataUPP) &gGetScrapDataProcRD,
  440.                     &refCon,
  441.                     kFormatListFormat,
  442.                     (Handle) destinationTypes,
  443.                     kTranslationScrapProgressDialogID);
  444.                     
  445. //#endif
  446.  
  447.     THROW_IF_ERROR(err);
  448.     
  449.     // Put destinationTypes into a ODTypeList
  450.     
  451.     ODULong        numDestTypes = ODGetHandleSize(destinationTypes) / sizeof(FormatAvailable);
  452. #ifdef ODDebug_Translation
  453.     somPrintf("GetTranslationOf: numDestTypes %d\n", numDestTypes);
  454. #endif
  455.     FormatAvailable*    osTypes = (FormatAvailable*) ODLockHandle(destinationTypes);
  456.     ODTypeList*    toTypeList = _fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
  457.     
  458.     OSType    fromOSType = LocalGetPlatformTypeFromISOType(fromType);
  459.     
  460.     for (ODULong i = 0; i < numDestTypes; i++) {
  461.         if (osTypes[i].theType != fromOSType) {
  462.             TempODType isoType = // DMc: make temp to ensure deletion
  463.                 somSelf->GetISOTypeFromPlatformType(ev, osTypes[i].theType, kODPlatformDataType);
  464.             toTypeList->AddLast(ev, isoType);
  465.         }
  466.     }
  467.     
  468.     ODUnlockHandle(destinationTypes);
  469.     ODDisposeHandle(destinationTypes);
  470.     
  471.     // Return the created ODTypeList
  472.     
  473.     return toTypeList;
  474. }
  475.  
  476. //------------------------------------------------------------------------------
  477. // ODTranslation: TranslateView
  478. //------------------------------------------------------------------------------
  479.  
  480. SOM_Scope ODTranslateResult  SOMLINK ODTranslationTranslateView(ODTranslation *somSelf, Environment *ev,
  481.         ODStorageUnitView* fromView,
  482.         ODStorageUnitView* toView)
  483. {
  484.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  485.     ODTranslationMethodDebug("ODTranslation","ODTranslationTranslateView");
  486.     
  487.     ODTranslateResult result = kODCannotTranslate;
  488.  
  489.     SOM_TRY
  490.  
  491.     if (_fMEOExists == kODFalse)
  492.         THROW(kODErrNoSysTranslationFacility);
  493.  
  494.     ODHandle    toDataHandle = kODNULL;
  495.     
  496.     // Get the source data    
  497.     TempODValueType fromType = fromView->GetType(ev); // DMc: ensure it's deleted
  498.     
  499.     ODULong size = fromView->GetSize(ev);
  500.     ODByteArray    fromDataBA;
  501.     fromView->GetValue(ev, size, &fromDataBA);
  502.  
  503.     // Get the to type
  504.     TempODValueType    toType = toView->GetType(ev); // DMc: ensure it's deleted
  505.  
  506.     // Do the translation
  507.     if (CommonTranslate(somSelf, ev, fromType, &fromDataBA, toType, &toDataHandle) == noErr) {
  508.     
  509.         // Create the toData
  510.         ODPtr toData = ODLockHandle(toDataHandle);
  511.         
  512.         // Set the value in the toView
  513.         StorageUnitViewSetValue(toView, ev, ODGetHandleSize(toDataHandle), toData);
  514.         
  515.         // Get rid of toData Byte Array and Handle
  516.  
  517.         ODUnlockHandle(toDataHandle);
  518.         ODDisposeHandle(toDataHandle);
  519.  
  520.         // Set up result
  521.         result = kODCanTranslate;
  522.     }
  523.     
  524.     ODDisposePtr(fromDataBA._buffer);
  525.     
  526.     SOM_CATCH_ALL
  527.         result = kODCannotTranslate;
  528.     SOM_ENDTRY
  529.  
  530.     return result;
  531. }
  532.  
  533. //------------------------------------------------------------------------------
  534. // ODTranslation: Translate
  535. //------------------------------------------------------------------------------
  536.  
  537. SOM_Scope ODTranslateResult  SOMLINK ODTranslationTranslate(ODTranslation *somSelf, Environment *ev,
  538.         ODValueType        fromType,
  539.         ODByteArray*    fromDataBA,
  540.         ODValueType        toType,
  541.         ODByteArray*    toDataBA)
  542. {
  543.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  544.     ODTranslationMethodDebug("ODTranslation","ODTranslationTranslate");
  545.     
  546.     ODTranslateResult    result = kODCannotTranslate;
  547.     ODHandle            toDataHandle = kODNULL;
  548.     
  549.     SOM_TRY
  550.  
  551.     // Check for MEO
  552.     
  553.     if (_fMEOExists == kODFalse)
  554.         THROW(kODErrNoSysTranslationFacility);
  555.     
  556.     ASSERT(fromDataBA != kODNULL, kODErrIllegalNullInput);
  557.     ASSERT(toDataBA != kODNULL, kODErrIllegalNullInput);
  558.     
  559.     // Translate
  560.     
  561.     if (CommonTranslate(somSelf, ev, fromType, fromDataBA, toType, &toDataHandle) == noErr) {
  562.         ODULong toDataSize = ODGetHandleSize(toDataHandle);
  563. #ifdef ODDebug_Translation
  564.     somPrintf("toDataHandle %x toDataSize %d\n", toDataHandle, toDataSize);
  565. #endif
  566.         ODPtr    toData = ODLockHandle(toDataHandle);
  567.         
  568.         *toDataBA = CreateByteArrayStruct(toData, toDataSize);
  569.         
  570.         // Get rid of handle
  571.         ODUnlockHandle(toDataHandle);
  572.         ODDisposeHandle(toDataHandle);
  573.         
  574.         // Set up return code
  575.         result = kODCanTranslate;
  576.     }
  577.     
  578.     SOM_CATCH_ALL
  579.         result = kODCannotTranslate;
  580.     SOM_ENDTRY
  581.     
  582.     return result;
  583. }
  584.  
  585. //------------------------------------------------------------------------------
  586. // ODTranslation: GetISOTypeFromPlatformType
  587. //------------------------------------------------------------------------------
  588.  
  589. SOM_Scope ODValueType  SOMLINK ODTranslationGetISOTypeFromPlatformType(ODTranslation *somSelf, Environment *ev,
  590.         ODPlatformType platformType,
  591.         ODPlatformTypeSpace typeSpace)
  592. {
  593.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  594.     ODTranslationMethodDebug("ODTranslation","ODTranslationGetISOTypeFromPlatformType");
  595.  
  596.     ODValueType type = kODNULL; ODVolatile(type);
  597.     
  598.     SOM_TRY
  599.     
  600.         type = LocalGetISOTypeFromPlatformType(platformType, typeSpace);
  601.         
  602.     SOM_CATCH_ALL
  603.     SOM_ENDTRY
  604.     
  605.     return type;
  606. }
  607.  
  608. //------------------------------------------------------------------------------
  609. // ODTranslation: GetPlatformTypeFromISOType
  610. //------------------------------------------------------------------------------
  611.  
  612. SOM_Scope ODPlatformType  SOMLINK ODTranslationGetPlatformTypeFromISOType(ODTranslation *somSelf, Environment *ev,
  613.         ODValueType type)
  614. {
  615.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  616.     ODTranslationMethodDebug("ODTranslation","ODTranslationGetPlatformTypeFromISOType");
  617.     
  618.     SOM_TRY
  619.         return LocalGetPlatformTypeFromISOType(type);
  620.     SOM_CATCH_ALL
  621.     SOM_ENDTRY
  622.     
  623.     return '    ';    // This is just used to pacify the compiler. This return result
  624.                     // should never be used by the caller.
  625. }
  626.  
  627. //=====================================================================================
  628. // CommonTranslate
  629. //=====================================================================================
  630.  
  631. OSErr CommonTranslate(ODTranslation* translation,
  632.                         Environment*    ev,
  633.                         ODValueType        fromType,
  634.                         ODByteArray*    fromDataBA,
  635.                         ODValueType        toType,
  636.                         ODHandle*        destHandle)
  637. {
  638.     // Set up params for Translation
  639.     
  640.     *destHandle = kODNULL;
  641.     TranslationRefCon    refCon;
  642.     
  643.     TempODTypeList    fromTypeList = 
  644.         ODTranslationGetData(translation)->fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
  645.     fromTypeList->AddLast(ev, fromType);
  646.     
  647.     refCon.InitTranslationRefCon(fromTypeList,
  648.                                     fromDataBA->_buffer,
  649.                                     translation->GetPlatformTypeFromISOType(ev, fromType),
  650.                                     (ODULong) fromDataBA->_length);
  651.     
  652.     OSType    destType = translation->GetPlatformTypeFromISOType(ev, toType);
  653.  
  654.     // Do the translation
  655.  
  656. //#ifdef __MWERKS__
  657.     *destHandle = ODNewHandle(0);
  658.     OSErr err = TranslateScrap((GetScrapDataUPP) &gGetScrapDataProcRD,
  659.                     &refCon,
  660.                     destType,
  661.                     (Handle) *destHandle,
  662.                     kTranslationScrapProgressDialogID);
  663.     if (err != noErr) {
  664.         ODDisposeHandle(*destHandle);
  665.         *destHandle = kODNULL;
  666.     }
  667.     
  668.     return err;
  669.  
  670. //#else
  671.  
  672. //    return noErr;
  673.  
  674. //#endif
  675.  
  676. }
  677.  
  678. //=====================================================================================
  679. // LocalGetISOTypeFromPlatformType
  680. //=====================================================================================
  681.  
  682. ODType LocalGetISOTypeFromPlatformType(ODPlatformType platformType,
  683.             ODPlatformTypeSpace typeSpace)
  684. {
  685.     ODType        isoType = kODNULL;
  686.     ODULong    prefixSize;
  687.  
  688.     switch (typeSpace)
  689.     {             
  690.         case kODPlatformDataType:
  691.         
  692.             prefixSize = ODISOStrLength(kODAppleScrapTypePrefix);
  693.             isoType = (ODValueType) ODNewPtr(prefixSize + sizeof(ODPlatformType) + 1,
  694.                                         ODGetDefaultHeap());
  695.             if (isoType != kODNULL) {
  696.                 ODISOStrCopy(isoType, kODAppleScrapTypePrefix);
  697.                 ODISOStrNConcat(isoType, (ODISOStr) &platformType, sizeof(ODPlatformType));
  698.                 isoType[prefixSize + sizeof(ODPlatformType)] = 0;
  699.             }
  700.             break;
  701.             
  702.         case kODPlatformFileType:
  703.             prefixSize = ODISOStrLength(kODAppleFileTypePrefix);
  704.             isoType = (ODValueType) ODNewPtr(prefixSize + sizeof(ODPlatformType) + 1,
  705.                                         ODGetDefaultHeap());
  706.             if (isoType != kODNULL) {
  707.                 ODISOStrCopy(isoType, kODAppleFileTypePrefix);
  708.                 ODISOStrNConcat(isoType, (ODISOStr) &platformType, sizeof(ODPlatformType));
  709.                 isoType[prefixSize + sizeof(ODPlatformType)] = 0;
  710.             }
  711.             break;
  712.                         
  713.         default:
  714.             break;
  715.     }
  716.     
  717.     return isoType;
  718. }
  719.  
  720. //=====================================================================================
  721. // LocalGetPlatformTypeFromISOType
  722. //=====================================================================================
  723.  
  724. ODPlatformType LocalGetPlatformTypeFromISOType(ODType type)
  725. {
  726.  
  727.     ODPlatformType    platformType = (ODPlatformType) 0L;
  728.     ODULong            prefixSize;
  729.     
  730.     prefixSize = ODISOStrLength(kODAppleScrapTypePrefix);
  731.     if (ODISOStrNCompare(kODAppleScrapTypePrefix, (ODISOStr) type, prefixSize)) 
  732.     {
  733.         prefixSize = ODISOStrLength(kODAppleFileTypePrefix);
  734.         if (ODISOStrNCompare(kODAppleFileTypePrefix, (ODISOStr) type, prefixSize)) 
  735.         {
  736.             prefixSize = 0;
  737.             platformType = kODNULL;
  738.         }
  739.     }
  740.     if (prefixSize > 0)
  741.     {
  742.         ODISOStrNCopy((ODISOStr) &platformType,
  743.                         (ODISOStr) ((ODSByte*) type + prefixSize), 
  744.                         sizeof(ODPlatformType));
  745.     }
  746.     return platformType;
  747. }
  748.  
  749. //=====================================================================================
  750. // GetScrapDataProc
  751. //=====================================================================================
  752. pascal OSErr GetScrapDataProc(ScrapType requestedFormat,
  753.                             Handle data,
  754.                             void* srcDataGetterRefCon)
  755. {
  756. #ifdef ODDebug_Translation
  757.     somPrintf("Entering GetScrapDataProc.\n");
  758. #endif
  759.  
  760.     Environment*     ev = somGetGlobalEnvironment();
  761.     
  762.     ODHandle    dataHandle = (ODHandle) data;
  763.     
  764.     // Get the refCon and return the data for the requested type
  765.     TranslationRefCon* refCon = (TranslationRefCon*) srcDataGetterRefCon;
  766.     
  767.     if (requestedFormat == kFormatListFormat) {
  768.         ODTypeList*    typeList = refCon->fTypeList;
  769.         ODULong        numOfTypes = typeList->Count(ev);
  770.  
  771. #ifdef ODDebug_Translation
  772.     somPrintf("numOfTypes: %d\n", numOfTypes);
  773. #endif
  774.  
  775.         ODSetHandleSize(dataHandle, numOfTypes * sizeof(FormatAvailable));
  776.         
  777.         FormatAvailable* dataPtr = (FormatAvailable*) ODLockHandle(dataHandle);
  778.         ODTypeListIterator* iter = typeList->CreateTypeListIterator(ev);
  779.         ODType isoType = iter->First(ev);
  780.         for (ODULong i = 0; i < numOfTypes; i++) {
  781.             OSType osType = LocalGetPlatformTypeFromISOType(isoType);
  782. #ifdef ODDebug_Translation
  783.     somPrintf("OSType %x ISOType %s\n", osType, isoType);
  784. #endif
  785.             ODBlockMove(&osType, &(dataPtr[i].theType), sizeof(OSType));
  786.             dataPtr[i].theLength = 0;
  787.             ODDisposePtr(isoType);
  788.             isoType = iter->Next(ev);
  789.         }
  790.         ODDeleteObject(iter);
  791.         ODUnlockHandle(dataHandle);
  792.         
  793. #ifdef ODDebug_Translation
  794.         ODULong    hSize = GetHandleSize((Handle) dataHandle);
  795.         ODULong    j;
  796.         ODPtr        hDataPtr = ODLockHandle(dataHandle);
  797.         somPrintf("DataHandle: ");
  798.         for (j = 0; j < hSize; j++)
  799.             somPrintf("%x ", ((char*) hDataPtr)[j]);
  800.         somPrintf("\n");
  801.         ODUnlockHandle(dataHandle);
  802. #endif
  803.     }
  804.     else {
  805. #ifdef ODDebug_Translation
  806.         somPrintf("%x %s %d\n", refCon->fDataType, refCon->fDataPtr, refCon->fDataSize);
  807. #endif
  808.         ODSetHandleSize(dataHandle, refCon->fDataSize);
  809.         ODPtr dataPtr = ODLockHandle(dataHandle);
  810.         ODBlockMove(refCon->fDataPtr, dataPtr, refCon->fDataSize);
  811.         ODUnlockHandle(dataHandle);
  812.     }
  813.     
  814. #ifdef ODDebug_Translation
  815.     somPrintf("Exiting GetScrapDataProc.\n");
  816. #endif
  817.     return noErr;
  818. }
  819.  
  820.